package br.com.condominio.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import br.com.condominio.beans.Funcionario;
import br.com.condominio.beans.Residencia;
import br.com.condominio.conexao.Conexao;

public class ResidenciaDAO {

	private Conexao conexao = new Conexao();

	public void criar(Residencia residencia) throws SQLException {
		Connection con = conexao.getConnection();
		PreparedStatement ps;

		String sqlInsert = "INSERT INTO residencia ( cod_Residencia, andar, bloco, numero, "
				+ " predio, ramal, rua, telefone) "
				+ " VALUES (?, ?, ?, ?, ?, ?, ?, ?);";
		try {
			ps = con.prepareStatement(sqlInsert);

			setPreparedStatement(residencia, ps);

			ps.executeUpdate();
			ps.close();
		} finally {
			conexao.liberarConnection(con);
		}
	}

	public void atualizar(Residencia residencia) throws SQLException {
		Connection con = null;
		try {
			con = conexao.getConnection();
			PreparedStatement ps;
			String sqlAtualizar = "UPDATE residencia SET cod_Residencia = ?, andar = ?, bloco = ?, "
					+ "numero = ?, predio = ?, ramal = ?, rua = ?, telefone = ?;";

			ps = con.prepareStatement(sqlAtualizar);
			setPreparedStatement(residencia, ps);

			ps.executeUpdate();
			ps.close();
		} finally {
			conexao.liberarConnection(con);
		}
	}

	public Residencia getResidenciaByID(int id) throws SQLException {
		Residencia residencia = null;
		Connection con = null;
		try {
			con = conexao.getConnection();
			PreparedStatement ps;
			String sqlSelect = "SELECT * FROM residencia WHERE cod_residencia = ? ;";
			ps = con.prepareStatement(sqlSelect);
			ps.setInt(1, id);
			ResultSet rs = ps.executeQuery();

			List<Residencia> resultado = getListaResidencias(rs);
			if (resultado.size() > 0)
				residencia = resultado.get(0);

			rs.close();
			ps.close();
		} finally {
			conexao.liberarConnection(con);
		}
		return residencia;
	}
	
	public void excluir(Integer codigo) throws SQLException {
		Connection con = null;
		try {
			con = conexao.getConnection();
			PreparedStatement ps;
			String sqlDelete = "DELETE FROM residencia WHERE cod_residencia = ? ;";
			ps = con.prepareStatement(sqlDelete);
			ps.setInt(1, codigo);
			ps.executeUpdate();

			ps.close();
		} finally {
			conexao.liberarConnection(con);
		}
	}

	public List<Residencia> getAllResidencias() throws SQLException {

		List<Residencia> resultado = null;

		Connection con = null;
		try {
			con = conexao.getConnection();
			PreparedStatement ps;
			String sqlSelect = "SELECT * FROM residencia;";

			ps = con.prepareStatement(sqlSelect);
			ResultSet rs = ps.executeQuery();

			resultado = getListaResidencias(rs);

			rs.close();
			ps.close();
		} finally {
			conexao.liberarConnection(con);
		}
		return resultado;
	}
	
	private List<Residencia> getListaResidencias(ResultSet rs)
			throws SQLException {
		List<Residencia> resultado = new ArrayList<Residencia>();
		while (rs.next()) {
			Residencia residencia = new Residencia();
			residencia.setCodResidencia((rs.getInt("cod_residencia")));
			residencia.setAndar(rs.getString("andar"));
			residencia.setBloco(rs.getString("bloco"));
			residencia.setNumero(rs.getString("numero"));
			residencia.setPredio(rs.getString("predio"));
			residencia.setRamal(rs.getString("ramal"));
			residencia.setRua(rs.getString("rua"));
			residencia.setTelefone(rs.getString("telefone"));
			resultado.add(residencia);
		}
		return resultado;
	}

	private void setPreparedStatement(Residencia residencia,
			PreparedStatement ps) throws SQLException {
		ps.setInt(1, residencia.getCodResidencia());
		ps.setString(2, residencia.getAndar());
		ps.setString(3, residencia.getBloco());
		ps.setString(4, residencia.getNumero());
		ps.setString(5, residencia.getPredio());//
		ps.setString(6, residencia.getRamal());
		ps.setString(7, residencia.getRua());
		ps.setString(8, residencia.getTelefone());
	}
}
